#include <iostream>
using namespace std;

#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

#include <cstring>

#include <functional>
#include <vector>

// void catchSignal(int signal)
// {
//     cout << "I am a process, my pid ::" << getpid() << "  get signal::" << signal << endl;
// }

// int main()
// {
//     int count = 0;
//     while(count != 5)
//     {
//         cout << "hello world" << endl;
//         sleep(1);
//         count++;
//     }

//     int a = 10;
//     a /= 0;

//     return 0;
// }

// signal(SIGINT, catchSignal);
// signal(SIGQUIT, catchSignal);
// 这里SIGINT用2也可以，但是用数字的话可读性不好，所以推荐用字母来表示
// signal(2, catchSignal);

// int main()
// {
//     int id = fork();
//     if(id == 0)
//     {
//         // 子进程睡100s
//         //cout << "child[" << getpid() << "] start to sleep" << endl;
//         //sleep(100);
//         int a = 10;
//         a /= 0;
//     }

//     // 父进程直接等待
//     int status = 0;
//     waitpid(id, &status, 0);          // 低7位表示退出信号                    // 第8位表示核心转储
//     cout << "child quit signal ::" << (status & 0x7f) << "  core dump ::" << ((status >> 7) & 1) << endl;
//     cout << "child pid ::" << id << endl;

//     return 0;
// }

// int main()
// {
//     int id = fork();
//     if(id == 0)
//     {
//         // 子进程睡100s
//         cout << "child[" << getpid() << "] start to sleep" << endl;
//         sleep(100);
//     }

//     sleep(2);
//     cout << "father send signal" << endl;
//     kill(id, 2); // 给子进程发送2号信号

//     // 父进程直接等待
//     int status = 0;
//     waitpid(id, &status, 0);          // 低7位表示退出信号                    // 第8位表示核心转储
//     cout << "child quit signal ::" << (status & 0x7f) << "  core dump ::" << ((status >> 7) & 1) << endl;
//     cout << "child pid ::" << id << endl;

//     return 0;
// }

// // 用法如下
// // ./myKill num pid 这里为了方便点，我就不加上信号前面的-了
// int main(int argc, char* argv[])
// {
//     if(argc != 3)
//     {
//         cout << "correct usage ::\n\t" << "./mykill num pid" << endl;
//         exit(1);
//     }

//     int signalNum = stoi(argv[1]);
//     int pid = stoi(argv[2]);
//     // 向指定进程发信号
//     kill(pid, signalNum);
//  raise(8);// 等价于 kill(getpid(), 8);
//
//     return 0;
// }

// int main(int argc, char* argv[])
// {
//     cout << "开始运行" << endl;
//     sleep(1);

//     abort();

//     return 0;
// }

// int main()
// {
//   // 创建匿名管道
//   int pipefd[2] = {0};
//   pipe(pipefd);
//   pid_t id = fork();

//   if (id == 0)
//   {
//     // 子进程关闭读端
//     close(pipefd[0]);

//     while(1)
//     {
//       // 子进程不断写入
//       int count = 0;
//       write(pipefd[1], &count, sizeof(int));
//       ++count;
//     }
//   }

//   // 父进程关闭读写端
//   close(pipefd[0]);
//   close(pipefd[1]);

//   // 父进程等待子进程终止
//   int status = 0;
//   waitpid(id, &status, 0);
//   cout << "child quit signal ::" << (status & 0x7f) << "  core dump ::" << ((status >> 7) & 1) << endl;

//   return 0;
// }


// void handler(int signal)
// {
//   cout << "get a signal ::" << signal << endl;
//   cout << count << endl;
//   alarm(1);
// }

// int count = 0;

// void showCount()
// {
//   cout << "count ::" << count << endl;
// }

// void showLog()
// {
//   cout << "这个是日志功能" << endl;
// }

// void logUser()
// {
//   // 当前登录的人
//   if(fork() == 0)
//   {
//     execl("/usr/bin/who", "who", nullptr);
//     exit(1);
//   }
//   wait(nullptr);
// }

// void flushdata()
// {
//   cout << "缓冲区刷新" << endl;
// }

// typedef function<void()> func;
// // 这里用function包装器包装了一下
// vector<func> callbacks;
// // 定时器功能
// // sig: 
// void catchSig(int signum)
// {
//   for(auto &f : callbacks)
//   {
//     f();
//   }
//   cout << "======================================" << endl;
//   alarm(1);
// }

// int main()
// {
//   signal(SIGALRM, catchSig);

//   callbacks.push_back(showCount);
//   callbacks.push_back(showLog);
//   callbacks.push_back(logUser);
//   callbacks.push_back(flushdata);
//   alarm(1);

//   while(1)
//   {
//     count++;
//   }

//   return 0;
// }

void func(int signal)
{
  sleep(1);
  cout << "获得信号:: " << signal << endl;
  exit(1);
}

int main()
{
  //signal(SIGFPE, func);

  //sigset_t;

  int a = 10;
  a /= 0;

  while(1)
  {
    sleep(1);
  }

  SIG_IGN;

  return 0;
}
